﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO.Base;
using AccesoDatos.DTO;
using System.Collections.Generic;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de ProfesorDAO
    /// </summary>
    public class ProfesorDAO : BaseDAO,IDAO
    {
        #region Singleton

        private static ProfesorDAO instance;

        private ProfesorDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de ProfesorDAO
        /// </summary>
        /// <returns>instancia de ProfesorDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static ProfesorDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new ProfesorDAO();
            }

            return instance;
        }

        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que apartir de un data reader devuelve un profesor DTO
        /// </summary>
        /// <param name="dr">SqlDataReader que contiene todos los parametros de busqueda</param>
        /// <returns>Objeto ProfesorDTO con todos los datos rellenos del dr</returns>
        private ProfesorDTO RellenaBean(SqlDataReader dr) 
        {
            ProfesorDTO bean = new ProfesorDTO();
            bean.CoPersona = this.GetNullableIntFromDataReader(dr, "CO_PERSONA");
            bean.CoProfesor = this.GetNullableIntFromDataReader(dr, "CO_PROFESOR");
            bean.NivelEstudios = this.GetStringFromDataReader(dr, "NIVEL_ESTUDIOS");
            bean.Dni = this.GetStringFromDataReader(dr, "DNI");
            if (dr["IMAGEN"].ToString() != String.Empty)
            {

                bean.Imagen = this.GetImageFromDataReader(dr, "IMAGEN");
            }
            bean.Userhash = this.GetStringFromDataReader(dr, "USERHASH");
            bean.Nombre = this.GetStringFromDataReader(dr, "NOMBRE");
            bean.Apellido1 = this.GetStringFromDataReader(dr, "APELLIDO1");
            bean.Apellido2 = this.GetStringFromDataReader(dr, "APELLIDO2");
            bean.Email = this.GetStringFromDataReader(dr, "EMAIL");
            bean.Nick = this.GetStringFromDataReader(dr, "NICK");

            return bean;
        }

        #endregion

        #region Miembros de IDAO

        /// <summary>
        /// Metodo que inserta un profesor en la base de datos
        /// </summary>
        /// <param name="dto">Objeto que contiene todos los parametros que se quieren insertar en la base de datos</param>
        public void Insert(IDTO dto)
        {
            ProfesorDTO filtro = new ProfesorDTO();
            filtro = (ProfesorDTO)dto;
            try
            {
                string sql = "spu_ProfesorDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@NivelEstudios", filtro.NivelEstudios);
                cmd.Parameters.AddWithValue("@Dni", GetSqlValue(filtro.Dni));
                cmd.Parameters.AddWithValue("@Userhash", GetSqlValue(filtro.Userhash));
                cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1", GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2", GetSqlValue(filtro.Apellido2));
                cmd.Parameters.AddWithValue("@Email", GetSqlValue(filtro.Email));
                cmd.Parameters.AddWithValue("@Nick", GetSqlValue(filtro.Nick));
                cmd.Parameters.AddWithValue("@Imagen", filtro.Imagen);

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex) 
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un profesor de la base de datos
        /// </summary>
        /// <param name="dto">Onjeto con el codigo de profesor para realizar la eliminacion</param>
        public void Delete(IDTO dto)
        {
            ProfesorDTO filtro = new ProfesorDTO();
            filtro = (ProfesorDTO)dto;
            try
            {
                string sql = "spu_ProfesorDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoProfesor", filtro.CoProfesor);
                cmd.Parameters.AddWithValue("@CoPersona", filtro.CoPersona);
                cmd.Parameters.AddWithValue("@NIvelEstudios", filtro.NivelEstudios);
                cmd.Parameters.AddWithValue("@Dni", GetSqlValue(filtro.Dni));
                cmd.Parameters.AddWithValue("@Userhash", GetSqlValue(filtro.Userhash));
                cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1", GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2", GetSqlValue(filtro.Apellido2));
                cmd.Parameters.AddWithValue("@Email", GetSqlValue(filtro.Email));
                cmd.Parameters.AddWithValue("@Nick", GetSqlValue(filtro.Nick));
                cmd.Parameters.AddWithValue("@Imagen", filtro.Imagen);

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que actualiza un registro de la base de datos
        /// </summary>
        /// <param name="filtro">Objeto IDTO que contiene los parametros que se van a actualizar</param>
        public void Update(IDTO dto)
        {
            ProfesorDTO filtro = new ProfesorDTO();
            filtro = (ProfesorDTO)dto;
            try
            {
                string sql = "spu_ProfesorDAO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoProfesor", filtro.CoProfesor);
                cmd.Parameters.AddWithValue("@CoPersona", filtro.CoPersona);
                cmd.Parameters.AddWithValue("@NivelEstudios", filtro.NivelEstudios);
                cmd.Parameters.AddWithValue("@Dni", GetSqlValue(filtro.Dni));
                cmd.Parameters.AddWithValue("@Userhash", GetSqlValue(filtro.Userhash));
                cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1", GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2", GetSqlValue(filtro.Apellido2));
                cmd.Parameters.AddWithValue("@Email", GetSqlValue(filtro.Email));
                cmd.Parameters.AddWithValue("@Nick", GetSqlValue(filtro.Nick));
                cmd.Parameters.AddWithValue("@Imagen", filtro.Imagen);

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Funcion que devuelve un listado de profesores
        /// </summary>
        /// <param name="filtro">Objeto con los parametros de busqueda(No usado para este objeto)</param>
        /// <returns>Lista con todos los profesores</returns>
        public List<IDTO> Get(IDTO dto)
        {
            ProfesorDTO filtro = new ProfesorDTO();
            filtro = (ProfesorDTO)dto;
            try
            {
                List<IDTO> lista = new List<IDTO>();
                string sql = "spu_ProfesorDAO_GetProfesores";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoProfesor", filtro.CoProfesor);
                cmd.Parameters.AddWithValue("@CoPersona", filtro.CoPersona);
                cmd.Parameters.AddWithValue("@NivelEstudios", filtro.NivelEstudios);
                cmd.Parameters.AddWithValue("@Nick", GetSqlValue(filtro.Nick)); 
                cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1", GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2", GetSqlValue(filtro.Apellido2));
                cmd.Parameters.AddWithValue("@Email", GetSqlValue(filtro.Email));
                cmd.Parameters.AddWithValue("@Dni", GetSqlValue(filtro.Dni));

                using (SqlDataReader dr = cmd.ExecuteReader()) 
                {
                    while (dr.Read()) 
                    {
                        ProfesorDTO bean = new ProfesorDTO();
                        bean=RellenaBean(dr);
                        if (bean.CoPersona != 15 && bean.CoPersona!=17)
                        {
                            lista.Add(bean);
                        }
                    }
                }
                return lista;
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }


        #endregion
    }
}